//
//  main.c
//  顺序表
//
//  Created by MAC on 16-3-22.
//  Copyright (c) 2016年 MAC. All rights reserved.
//

#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 40
#define ERROR       0
#define TRUE1        1
//创建了一个简单的顺序表，表中的数据元素使用数组来设置，长度为length
typedef struct sqlist{
    //表中元素的数据,用一个数组来表示
    int elem_array[MAX_SIZE];
    //表的长度
    int length;
}SqList;


//1.初始化表
int Init_SqList(SqList * L)
{
    //分配内存,需要程序员手动分配内存(堆区分配)
    //分配最大长度MAX_SIZE个数据类型（int）的总大小
    int * p = L->elem_array;
    //数组名作为数组的地址是一个常量，不能去赋值，只能将分配的内存赋值给指针变量，不能赋值给常量。
    p= (int *)malloc(sizeof(int)*MAX_SIZE);
    //当分配内存失败，提示
    if (p==NULL) {
        printf("分配空间失败\n");
        return ERROR;
    }
    else{
        //设置表的长度一开始为0
        L->length = 0;
        return TRUE1;
    }
}

//2.顺序表的插入操作
/*
 步骤的实现：
 1.将表L中的第i个至最后一个元素依次往后移动一个位置
 2.将新的要插入的结点放在a(i-1)结点后面
 3.表的长度加1
 */
int Insert_SqList(SqList* L, int i, int e)
{
    int j = 0;
    //判断插入的位置是否在表的范围内
    if (i<0 || i>L->length+1) {
        printf("插入位置错误\n");
        return ERROR;
    }
    //判断表是否溢出
    if (L->length>=MAX_SIZE) {
        printf("线性表溢出\n");
        return ERROR;
    }
    //移动插入位置后面的所有元素
    for (j = L->length-1; j>=i-1; j--) {
        //每一个元素往后移动一个位置
        L->elem_array[j+1] = L->elem_array[j];
    }
    //循环结束后意味者指定位置已经腾出来空间，可以存放要插入的数据了
    L->elem_array[i-1] = e;
    L->length++;
    return TRUE1;
    
    
}

//顺序表的删除操作（第i个位置的值）
/*
 步骤：1.将位置i后面的值都依次往前移动一个位置。
 2.表的长度－1
 
 */

int Delete_SqList(SqList* L, int i)
{
    //判断表是否为空，如果为空就不存在该操作
    if (L->length == 0) {
        printf("数据为空，不能执行该操作\n");
        return ERROR;
    }
    //判断删除的位置存不存在
    else if (i<1||i>L->length)
    {
        printf("要删除的数据不存在\n");
        return ERROR;
    }else{
        //执行删除操作
        for (int j = i; j<L->length; j++) {
            L->elem_array[j-1] = L->elem_array[j];
        }
        L->length -- ;
        return TRUE1;
    }
}

//返回成绩表的长度（有多少个同学的成绩）
int Length_SqList(SqList * L)
{
    return L->length;
}

//给成绩表的末尾添加一个数据
int  add_SqList(SqList * L, int sc)
{
    if (L->length == MAX_SIZE) {
        printf("数据表已溢出\n");
        return ERROR;
    }
    L->elem_array[L->length] = sc;
    return TRUE1;
}

//删除指定的数据值(删除第一次分数为59的成绩数据)
/*
 步骤：1.要在成绩表中找到该成绩第一次出现的位置
 2.调用删除指定位置的函数来删除
 3.长度－1
 
 */
int Delete_Data(SqList * L, int sc)
{
    //i 为第一次出现sc成绩的位置
    int i = 0;
    //如果表为空表，操作不被执行
    if (L->length == 0) {
        printf("成绩表中没有数据，不能执行该操作\n");
        return ERROR;
    }
    //循环查找要删除的成绩的位置
    for (i=0; i<L->length; i++) {
        //如果找到了这个成绩,那么就break
        if (sc == L->elem_array[i]) {
            break;
        }
    }
    //  如果循环查找到了成绩表的最后还没找到
    if (i == L->length) {
        printf("没有找到该成绩，删除失败\n");
        return ERROR;
    }
    //删除i位置的那个成绩
    Delete_SqList(L, i+1);
    return TRUE1;
}

//打印成绩表的函数
void Print_SqList(SqList* L)
{
    printf("线性表的内容：");
    for (int i = 0; i<L->length;i++) {
        printf("%d ", L->elem_array[i]);
    }
    printf("\n");
    
}

int main(int argc, const char * argv[])
{
    //使用顺序表
    SqList list;
    if(!Init_SqList(&list))
    {
        printf("表初始化失败\n");
    }else{
        printf("表初始化成功\n");
        if(!Insert_SqList(&list, 1, 89))
        {
            printf("数据插入失败\n");
        }
        else{
            printf("数据插入成功\n");
        }
        Insert_SqList(&list, 2, 99);
        Insert_SqList(&list, 3, 59);
        Insert_SqList(&list, 4, 76);
        Insert_SqList(&list, 3, 65);
    }
    
    //打印线性表的数据
    Print_SqList(&list);
    
    Delete_SqList(&list, 1);
    Print_SqList(&list);
    Delete_Data(&list, 100);
    Print_SqList(&list);
    return 0;
}



